package sys

/*******************************************************************************
Copyright:cloud
Author:cloudapex@126.com
Version:1.0
Date:2020-06-12
Description: 角色相关接口
*******************************************************************************/
import (
	"context"
	"service/model/mod"
	model "service/model/permis"

	gpc "gitee.com/cloudapex/protos/comm/pb"
	gpb "gitee.com/cloudapex/protos/permis/pb"

	"gitee.com/cloudapex/ulern/htp"
	"gitee.com/cloudapex/ulern/util"
	"github.com/gin-gonic/gin"
)

/*
 * 描述: 角色种类
 * 路由: /role/kind
 * 方法: GET
 *********************************************************************/
type MenuKind struct {
}

func (this *MenuKind) Handle(c *gin.Context, ctx context.Context) htp.Response {
	return htp.RespOK("", &struct {
		Kinds []model.RoleKind `json:"kinds"`
	}{model.RoleKinds})
}

/*
 * 描述: 角色列表
 * 路由: /role/list
 * 方法: GET
 *********************************************************************/
type RoleList struct {
	mod.SortFinder
	mod.PageFinder

	Name   string `form:"name"  json:"name" binding:"omitempty,max=64"`      // 角色名
	Kind   int32  `form:"kind" json:"kind" binding:"omitempty"`              // 角色业务种类
	State  int    `form:"state"  json:"state" binding:"omitempty"`           // 状态(1:正常;2:失效)
	Remark string `form:"remark"  json:"remark" binding:"omitempty,max=128"` // 备注
}

func (this *RoleList) Handle(c *gin.Context, ctx context.Context) htp.Response {
	user := mod.CurrUser(c)

	req := gpb.RoleListReq{CoId: user.CId}
	if err := util.Convert(&req, this); err != nil {
		return htp.RespConvertErr("", err)
	}
	if err := util.Convert(&req.Sorte, this.SortFinder); err != nil {
		return htp.RespConvertErr("", err)
	}
	if err := util.Convert(&req.Pager, this.PageFinder); err != nil {
		return htp.RespConvertErr("", err)
	}

	rsp, err := model.Sysm.RoleList(ctx, &req)
	if err != nil {
		return htp.RespModelErr("", err)
	}
	return htp.RespOK("", rsp)
}

/*
 * 描述: 角色简表
 * 路由: /role/labs
 * 方法: GET
 *********************************************************************/
type RoleLabs struct {
	Kind  int32  `form:"kind" json:"kind" binding:"omitempty"`        // 种类
	Name  string `form:"name" json:"name" binding:"omitempty,max=64"` // 角色名
	State int32  `form:"state" json:"state" binding:"omitempty"`      // 状态(1:正常;2:失效)
}

func (this *RoleLabs) Handle(c *gin.Context, ctx context.Context) htp.Response {
	user := mod.CurrUser(c)

	rsp, err := model.Sysm.RoleLabs(ctx, &gpb.RoleLabsReq{
		CoId:  user.CId,
		Kind:  this.Kind,
		Name:  this.Name,
		State: this.State})
	if err != nil {
		return htp.RespModelErr("", err)
	}
	return htp.RespOK("", rsp)
}

/*
 * 描述: 新增角色
 * 路由: /role/add
 * 方法: POST
 *********************************************************************/
type RoleAdd struct {
	Name   string `form:"name" json:"name" binding:"required,max=64"`       // 角色名
	Kind   int32  `form:"kind" json:"kind" binding:"required"`              // 角色业务种类
	Order  int    `form:"order" json:"order" binding:"omitempty"`           // 排序值
	State  int    `form:"state" json:"state" binding:"required"`            // 状态(1:正常;2:失效)
	Remark string `form:"remark" json:"remark" binding:"omitempty,max=128"` // 备注
}

func (this *RoleAdd) Handle(c *gin.Context, ctx context.Context) htp.Response {
	user := mod.CurrUser(c)

	req := gpb.RoleAddReq{CoId: user.CId}
	if err := util.Convert(&req, this); err != nil {
		return htp.RespConvertErr("", err)
	}

	rsp, err := model.Sysm.RoleAdd(ctx, &req)
	if err != nil {
		return htp.RespModelErr("", err)
	}
	return htp.RespOK("", rsp)
}

/*
 * 描述: 编辑角色
 * 路由: /role/upd
 * 方法: POST
 *********************************************************************/
type RoleUpd struct {
	Id     int64  `form:"id" json:"id" binding:"required"`                  // 角色Id
	Name   string `form:"name" json:"name" binding:"required,max=64"`       // 角色名
	Kind   int32  `form:"kind" json:"kind" binding:"required"`              // 角色业务种类
	Order  int    `form:"order" json:"order" binding:"omitempty"`           // 排序值
	State  int    `form:"state" json:"state" binding:"required"`            // 状态(1:正常;2:失效)
	Remark string `form:"remark" json:"remark" binding:"omitempty,max=128"` // 备注
}

func (this *RoleUpd) Handle(c *gin.Context, ctx context.Context) htp.Response {
	//user := mod.CurrUser(c)

	req := gpb.RoleUpdReq{}
	if err := util.Convert(&req, this); err != nil {
		return htp.RespConvertErr("", err)
	}

	rsp, err := model.Sysm.RoleUpd(ctx, &req)
	if err != nil {
		return htp.RespModelErr("", err)
	}
	return htp.RespOK("", rsp)
}

/*
 * 描述: 删除角色
 * 路由: /role/del
 * 方法: POST
 *********************************************************************/
type RoleDel struct {
	Id int64 `form:"id" json:"id" binding:"required"` // 权限Id
}

func (this *RoleDel) Handle(c *gin.Context, ctx context.Context) htp.Response {
	//user := mod.CurrUser(c)

	rsp, err := model.Sysm.RoleDel(ctx, &gpc.IdRequest{Id: this.Id})
	if err != nil {
		return htp.RespModelErr("", err)
	}
	return htp.RespOK("", rsp)
}

/*
 * 描述: 获取角色权限Ids
 * 路由: /role/choice
 * 方法: GET
 *********************************************************************/
type RoleChoice struct {
	Id int64 `form:"id" json:"id" binding:"required"` // 角色Id
}

func (this *RoleChoice) Handle(c *gin.Context, ctx context.Context) htp.Response {
	//user := mod.CurrUser(c)

	rsp, err := model.Sysm.RoleChoice(ctx, &gpc.IdRequest{Id: this.Id})
	if err != nil {
		return htp.RespModelErr("", err)
	}
	return htp.RespOK("", rsp)
}

/*
 * 描述: 修改角色权限Ids
 * 路由: /role/choose
 * 方法: POST
 *********************************************************************/
type RoleChoose struct {
	RId  int64   `form:"rId" json:"rId" binding:"required"`    // 角色Id
	PIds []int64 `form:"pIds" json:"pIds" binding:"omitempty"` // 权限Ids
}

func (this *RoleChoose) Handle(c *gin.Context, ctx context.Context) htp.Response {
	user := mod.CurrUser(c)
	this.PIds = util.RemoveDuplicate64(this.PIds)
	rsp, err := model.Sysm.RoleChoose(ctx, &gpb.RoleChooseReq{CoId: user.CId, RId: this.RId, PIds: this.PIds})
	if err != nil {
		return htp.RespModelErr("", err)
	}
	return htp.RespOK("", rsp)
}
